import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// 创建 axios 实例
const service = axios.create({
  baseURL: '/common',
  timeout: 20 * 1000 // 请求超时 20s
})

// request 拦截器
service.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = 'multipart/form-data'
    if (store.getters.expirationTime) {
      config.headers['expirationTime'] = store.getters.expirationTime
    }
    // 如果有token，token 放入请求头的 X-Token 中
    if (store.getters.token) {
      config.headers['Authorization'] = getToken()

      // config.transformRequest = [function(data) {
      //   // 处理POST请求参数，把token加到请求参数里，后台匹配请求头里的token和请求参数里的token，防CSRF
      //   if ((typeof data) === 'object') {
      //     data.append('antiToken', getToken())
      //     return data
      //   }
      //   return data + '&antiToken=' + getToken()
      // }]
    }
    // 如果有 companyId，companyId 放入请求参数中
    return config
  },
  error => {
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    const resCode = response.data.code
    if (resCode) {
      switch (resCode) { // 校验返回code
        case 200: // 成功
          return response.data
        case 401: // 需要登录 或 登录超时
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
          break
        default:
          if (response.data.msg == null || response.data.msg.indexOf('exception') != -1 || response.data.msg.length > 200) {
            console.log(response.data.msg)
            Message({
              message: '发生未知错误，请联系系统管理员。',
              type: 'error',
              duration: 2000
            })
          } else {
            Message({
              message: response.data.msg,
              type: 'error',
              duration: 2000
            })
          }
          store.state.app.loadingFull = false
          return new Promise((resolve, reject) => { reject() })
      }
    } else {
      return response
    }
  },
  error => { // response 出错
    Message({
      message: error,
      type: 'error',
      duration: 2000
    })
  }
)

export default service
